5

谈谈mongodb如何设计评论表的表结构

前言
打算使用node+koa+mongodb打造一个博客的后台,遇到了如何设计评论表的困惑,因为如果采用开放评论的模式,就会导致评论的层层嵌套,使得管理和展示都变得非常复杂。通过各方探索和思考,我发现了一个非常不错的设计方法,在此分享给大家,希望可以对同样困惑的人给与帮助。

说明
1.我在设计的时候不考虑评论的评论的评论这种操作,我也是借鉴了sf这个网站的设计,因为如果考虑到这层操作,这个表结构的设计就会变的相当复杂,毕竟不是群聊,而且该评论下的动态会推送给所有人,你们如果想要交流可以直接在最大的评论下评论,或者发私信,所以没必要考虑到这一层。
2.这种设计是我个人的想法,初生牛犊,难免会有不成熟的地方,希望有不足的地方可以评论或者发私信告知我改正,方便我们学习成长。


评论表的表结构:

{
    "_id" : ObjectId("597aa23add840cd4ce0681d1"),
    "comment_blog_id" : "blog id",
    "comment_user_id" : "A",
    "comment_content" : "A的评论",
    "create_time" : "2017-15-12 14:00",
    "comment_responses" : [ 
        {
            "response_user_id" : "B",
            "response_user_phone" : "B的phone",
            "response_user_nickname" : "B的nickname",
            "response_content" : [ 
                "这是B给A的评论(带着索引index)", 
                "这是B给A的评论(带着索引index)", 
                "这是B给A的评论(带着索引index)"
            ],
            "create_time" : "2017-15-12 14:00",
            "get_reply" : [ 
                "这是A给B的某一个评论的回复如果有就对应插入index对应的元素没有就是空串", 
                "A没有回复B这一条就是空串", 
                "A个神经病跳着回复了这一条评论,这数组的第三个元素就是A回复的内容"
            ]
        }, 
        {
            "response_user_id" : "C",
            "response_user_phone" : "C的phone",
            "response_user_nickname" : "C的nickname",
            "response_content" : [ 
                "这是C给A的评论(带着索引index)", 
                "这是C给A的评论(带着索引index)", 
                "这是C给A的评论(带着索引index)"
            ],
            "create_time" : "2017-15-12 14:00",
            "get_reply" : [ 
                "这是A给C的第index个评论的回复", 
                "A没有回复C这一条就是空串", 
                "A个神经病跳着回复了这一条评论,这数组的第三个元素就是A回复的内容"
            ]
        }
    ]
}

插入与展示的方法
1.A在B的第index条评论下回复了B,那么对应的内容就存放在get_reply[index]里面。
2.展示的时候先遍历显示A的评论
3.然后遍历A里面的comment_responses数组。
4.接着遍历comment_responses数组中的元素的response_content数组
5.以第一条为例,遍历response_content数组显示B给A的评论,然后检查get_reply数组中的对应索引的元素是不是空,空代表没有回复,不显示,非空则跟着这条评论显示回复。
6.以此类推即可完成显示。


慢思考快行动
361 声望22 粉丝

有梦想但又不失风趣的程序员